package com.cskaoyan.javase._1extends._4hierarchy;

/**
 * 继承层次
 * 思考:
 *      Java中的一个类，能不能使用extends关键字同时继承多个类呢?
 * 这是做不到的。Java的语法规定一个类，在使用extends关键字直接继承某个类时，最多只能继承一个，
 * 即一个类只能有一个直接父类。（开个玩笑的说法，谁也没有两个亲爹吧？）
 * 像Java这种，只能有一个直接父类，而不能有两个或更多的设计，称之为"单重继承"或者"单继承"。
 * 而像C++当中，一个类可以直接继承多个类，就称之为"多重继承"或者"多继承"。
 *
 * Java中一个类不能直接继承两个类,java中某个类最多只有一个直接父类.
 *
 * 思考:
 *      Java中一个类就只能有一个父类呢?
 *      显然不是,一个类虽然只能有一个直接父类,但是直接父类还有直接父类,那么这个就会存在多个间接父类.
 *
 * 虽然直接父类只有一个，但Java中一个类仍然可以有很多个"间接父类"，因为父类可能还有父类。比如A继承B，B又继承了C，那么A的直接父类就是B，间接父类是C。
 * 于是就形成了下面几个概念：
 * 祖先类：处在继承顶层的类。
 *      Object类是Java所有类继承层次中顶层祖先类。Java中的每个类，都或直接，或间接的继承了Object。
 *      注:
 *          Java中如果一个类没有直接使用extends关键字,直接继承某个类,那么它就隐式继承Object.
 *          当然隐式继承不要写出来了
 *
 * 继承层次（hierarchy）：由某个祖先类派生出来的所有类的集合叫做继承层次。
 *
 * 继承链：从某一个子类开始，到其祖先类的路径。
 *
 *  在Java中定义一个类，如果没有直接通过语法写出继承了Xxx类，那么它的直接父类就是——Object。
 *
 *
 * @since 17:25
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        // Son s = new Son();
        /*
            在一条继承链中，总称呼下游类是上游类的子类，不管隔了几层。没有孙子类或者重孙类这种概念。
            在一条继承链中的，下游的类总是继承上游类的所有成员，不管隔了几层。
            在一条继承链中，下游类总可以看成一个上游类，存在"is-a"关系。

            重要:
            不在同一条继承链中的类，没有任何关系。
                虽然看起来像"兄弟姐妹"类，但是Java是不讲究血统的。
            尤其注意,不在同一条继承链中,引用数据类型的类型转换也是不能发生的
            引用数据类型的类型转换一定是发生在同一条继承链中
            同一条继承链中,从子到父,是向上转型,是自动类型转换
            同一条继承链中,从父到子,是向下转型,是强制类型转换

         */

        Grandson gs = new Grandson();
        System.out.println(gs.fVar);

        // 思考: 创建Grandson对象有几种方式?
        // 创建Grandson对象可以使用几种引用接收?
        // 排除Object(当然Object是所有类的父类,它可以)

        Son s = new Grandson();
        Father f = new Grandson();
        Grandfather gf = new Grandson();
        Object o = new Grandson();

        // Father2 f2 = new Grandson();
    }
}

// Class 'Grandfather' explicitly extends 'java.lang.Object'
class Grandfather  {
    int gVar;
}

class Father extends Grandfather {
    int fVar;

    public void test() {
    }
}

class Father2 extends Grandfather {
    int f2Var;
    public void method() {
    }
}

// Java中一个类不能直接继承两个类
// class Son extends Father,Father2{}
class Son extends Father {
    int sVar;
}

class Grandson extends Son {
    int gsVar;
}

class A extends Grandson{}